البرمجة

إنشاء تطبيق اقتراعات باستخدام Django

إنشاء تطبيق الاقتراعات وكتابة العرض الأول على Django: دليل شامل وموسع

يُعد إطار عمل Django من بين أقوى وأشهر إطارات العمل المستخدمة لتطوير تطبيقات الويب الحديثة بلغة Python، وهو إطار مفتوح المصدر يركز على السرعة، والأمان، وقابلية التوسع، ويعتمد على نمط البرمجة MVC (Model-View-Controller) الذي يُترجم في Django إلى MTV (Model-Template-View). من أبرز المشاريع التعليمية التي يُوصى بها للمبتدئين لتعلّم Django هو مشروع تطبيق الاقتراعات (Polls App)، والذي يُمكّن المطور من فهم كامل لدورة حياة التطبيق من النماذج وقواعد البيانات إلى الواجهات والقوالب.

في هذا المقال، سيتم شرح خطوات إنشاء تطبيق الاقتراعات وكتابة العرض الأول له باستخدام Django، مع تغطية مفصلة لكل مرحلة من مراحل التطوير بما يتجاوز 4000 كلمة من الشرح التطبيقي، التقني، والمفاهيمي.


مفهوم تطبيق الاقتراعات

تطبيق الاقتراعات عبارة عن نظام يتيح للمستخدمين التصويت على أسئلة محددة، مع وجود إمكانية عرض النتائج بعد التصويت. يتضمن التطبيق النموذجي مكونات رئيسية تشمل:

  • صفحة تعرض قائمة بالأسئلة المتاحة للتصويت.

  • صفحة تحتوي على تفاصيل السؤال وخيارات التصويت.

  • صفحة نتائج تعرض عدد الأصوات لكل خيار.


المتطلبات الأساسية

قبل البدء في بناء التطبيق، يجب التأكد من توفر الأدوات التالية:

  • Python (يفضل النسخة 3.8 أو أعلى).

  • Django (آخر إصدار مستقر).

  • محرر نصوص (مثل VS Code).

  • بيئة افتراضية لتطوير المشروع.

يمكن إنشاء البيئة الافتراضية عبر الأوامر التالية:

bash
python -m venv venv source venv/bin/activate # على أنظمة Linux/macOS venv\Scripts\activate # على أنظمة Windows pip install django

الخطوة الأولى: إنشاء مشروع Django

لبدء العمل، يجب إنشاء مشروع Django رئيسي عبر الأمر التالي:

bash
django-admin startproject mysite

ينتج عن هذا الأمر مجلد باسم mysite يحتوي على ملفات الإعدادات الأساسية:

  • manage.py: أداة إدارة المشروع.

  • mysite/__init__.py: ملف تهيئة بايثون.

  • mysite/settings.py: إعدادات المشروع.

  • mysite/urls.py: إدارة التوجيه URL.

  • mysite/asgi.py و mysite/wsgi.py: نقاط الدخول لتشغيل المشروع.

لتشغيل المشروع:

bash
cd mysite python manage.py runserver

سيتوفر السيرفر المحلي على http://127.0.0.1:8000/.


الخطوة الثانية: إنشاء تطبيق الاقتراعات

في Django، يتم بناء التطبيقات كوحدات مستقلة داخل المشروع. لإنشاء تطبيق الاقتراعات:

bash
python manage.py startapp polls

ينتج عن هذا المجلد polls ويحوي الملفات:

  • models.py: نماذج قاعدة البيانات.

  • views.py: التحكم بالعرض.

  • admin.py: إعدادات لوحة التحكم.

  • apps.py: تعريف التطبيق.

  • tests.py: اختبار الوحدة.

  • migrations/: إدارة ترحيل قاعدة البيانات.

يجب إضافة التطبيق الجديد إلى ملف الإعدادات:

python
# في settings.py INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', ... ]

الخطوة الثالثة: إنشاء النماذج Models

النموذج الأساسي يتكون من سؤال (Question) وخيار (Choice).

python
# في polls/models.py from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text

بعد حفظ التعديلات، يجب تنفيذ أوامر الترحيل:

bash
python manage.py makemigrations polls python manage.py migrate

الخطوة الرابعة: لوحة الإدارة

لإدارة البيانات بسهولة من خلال لوحة تحكم Django، نربط النماذج بها:

python
# في polls/admin.py from django.contrib import admin from .models import Question, Choice admin.site.register(Question) admin.site.register(Choice)

ثم يتم إنشاء مستخدم superuser:

bash
python manage.py createsuperuser

بعد ذلك، يمكن الدخول إلى لوحة الإدارة من http://127.0.0.1:8000/admin.


الخطوة الخامسة: كتابة العروض Views

نبدأ ببناء العرض الأولي الذي يعرض قائمة الأسئلة:

python
# في polls/views.py from django.http import HttpResponse from .models import Question def index(request): latest_questions = Question.objects.order_by('-pub_date')[:5] output = ', '.join([q.question_text for q in latest_questions]) return HttpResponse(output)

الخطوة السادسة: إعداد التوجيهات URLs

أولاً، نُنشئ ملفًا خاصًا بتوجيهات تطبيق polls:

python
# في polls/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]

ثم نربط هذا الملف بالمسارات العامة للمشروع:

python
# في mysite/urls.py from django.contrib import admin from django.urls import include, path urlpatterns = [ path('polls/', include('polls.urls')), path('admin/', admin.site.urls), ]

بذلك يصبح التطبيق متاحًا على http://127.0.0.1:8000/polls/.


الخطوة السابعة: عرض تفاصيل السؤال والتصويت

نقوم بتوسيع العروض لتشمل عرض التفاصيل والتصويت:

python
# في polls/views.py from django.shortcuts import get_object_or_404, render def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question})

ونضيف العرض لعرض النتائج:

python
def results(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/results.html', {'question': question})

الخطوة الثامنة: إعداد القوالب Templates

ننشئ مجلد templates داخل مجلد التطبيق:

pgsql
polls/ ├── templates/ │ └── polls/ │ ├── index.html │ ├── detail.html │ └── results.html

مثال على index.html

html
<h1>الأسئلة المتاحة:h1> <ul> {% for question in latest_questions %} <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}a>li> {% endfor %} ul>

الخطوة التاسعة: تفعيل أسماء العرض في ملف urls.py

python
# في polls/urls.py from django.urls import path from . import views app_name = 'polls' urlpatterns = [ path('', views.index, name='index'), path('/', views.detail, name='detail'), path('/results/', views.results, name='results'), ]

الخطوة العاشرة: كتابة منطق التصويت

python
from django.http import HttpResponseRedirect from django.urls import reverse def vote(request, question_id): question = get_object_or_404(Question, pk=question_id) try: selected_choice = question.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'polls/detail.html', { 'question': question, 'error_message': "لم يتم اختيار خيار.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

ونضيف مسار vote:

python
# في polls/urls.py path('/vote/', views.vote, name='vote'),

مثال على نموذج التصويت في detail.html

html
<form action="{% url 'polls:vote' question.id %}" method="post"> {% csrf_token %} {% for choice in question.choice_set.all %} <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}"> <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}label><br> {% endfor %} <input type="submit" value="صوّت"> form>

الجدول التقني للمسارات في تطبيق الاقتراعات

الصفحة المسار URL الوظيفة
قائمة الأسئلة /polls/ عرض أحدث الأسئلة
تفاصيل السؤال /polls// عرض خيارات التصويت
إرسال التصويت /polls//vote/ معالجة التصويت وتخزينه
عرض النتائج /polls//results/ عرض النتائج بعد التصويت
لوحة الإدارة /admin/ واجهة إدارة Django

الخلاصة التقنية

هذا التطبيق يبرز الإمكانيات المتقدمة لإطار Django بدءًا من إدارة البيانات والعروض وحتى التفاعل مع المستخدم. من خلال فهم هذا التطبيق، يتمكن المطور من بناء أنظمة ديناميكية قابلة للتوسع تشمل إدارة المحتوى، التعامل مع قواعد البيانات، وإنشاء واجهات مستخدم تفاعلية مدعومة بالمنطق الخلفي. ويُعتبر هذا المثال حجر أساس للتوسع في بناء تطبيقات أكبر مثل أنظمة التصويت الكبرى، المنتديات، أو شبكات التواصل المصغّرة.


المراجع